Rails 例外
ユーザーが任意のエラーをハンドリングしたい場合、rescue_fromを使う
ユーザーが明示的にエラーハンドリングしていない例外 ActionDispatch::ShowExceptionsミドルウェアが処理する
アプリケーションが返すすべての例外をrescueし、config.exceptions_appで設定した例外処理用アプリケーションを呼び出す
config.exceptions_app
デフォルトではActionDispatch::PublicExceptionsアプリケーションが設定されている
カスタムアプリケーションを設定することもできる
動的にエラーページやレスポンスを制御できる
code:config/application.rb
config.exceptions_app = CustomExceptionsAppWrapper.new(exceptions_app: routes)
code:lib/custom_exceptions_app_wrapper.rb
class CustomExceptionsAppWrapper
def initialize(exceptions_app:)
@exceptions_app = exceptions_app
end
def call(env)
request = ActionDispatch::Request.new(env)
fallback_to_html_format_if_invalid_mime_type(request)
@exceptions_app.call(env)
end
private
def fallback_to_html_format_if_invalid_mime_type(request)
request.formats
rescue ActionDispatch::Http::MimeNegotiation::InvalidType
request.set_header "CONTENT_TYPE", "text/html"
end
end
関連
https://www.youtube.com/watch?v=zcT5GufiQ-0